<?php

if (!defined('BASEPATH'))
    exit('No direct script access allowed');

/**
 * hir CRUD model class 
 *
 * @author Gabor Bota <gab.bota at 3pixel.hu>
 */
Class hir_model extends CI_Model {

    public $hir_table;
    public $relationship_table;
    public $hir_cimke_table;

    function __construct() {
        // Call the Model constructor
        parent::__construct();
        // hír cimke modell kell
        $this->load->model('hir_cimke_model');
        // dbprefixek
        $this->hir_table = $this->db->dbprefix('hirek');
        $this->relationship_table = $this->db->dbprefix('term_taxonomy_relationships');
        $this->hir_cimke_table = $this->db->dbprefix('hir_cimke');
    }

    /**
     * 
     * 
     * 
     * Update hir by id.
     * 
     * 
     * @return true on success
     */
    function update_hir($hir_data = array()) {
        // if hir does not exists throw hir_not_exists_exception
        if ($this->get_hir($hir_data['hir_id']) == FALSE)
            throw new not_exists_exception("hir");

        // kimentjük a cimkéket, ha vannak egy string-be
        $cimkek = NULL;
        if (isset($hir_data['hir_cimkek'])) {
            $cimkek = $hir_data['hir_cimkek'];
            // kiszedjük az insert-ből, mivel nem ott kell
            unset($hir_data['hir_cimkek']);
        }

        // do selection and update data
        $this->db->where('hir_id', $hir_data['hir_id']);
        $this->db->update($this->hir_table, $hir_data);

        // elmentjük a cimkeket, ha létrehoztuk a stringüket előbb.
        if (!is_null($cimkek) && $cimkek != '') {
            // ha az utolsó karaktere | akkor azt itt kiszedjük
            if ($cimkek[strlen($cimkek) - 1] == "|") {
                $cimkek = substr($cimkek, 0, -1);
            }

            // elválasztóként univerzálisan |-ot használunk ebben a rendszerben
            $cimkek = explode("|", $cimkek);

            foreach ($cimkek as $cimke) {
                $cimke = trim($cimke);
            }
            // elmentjük a címkéket (ha kell)
            $this->hir_cimke_model->save_hir_cimke($cimkek);
            // most pedig elmentjük a kapcsolatokat.
            $this->save_realationships($hir_data['hir_id'], $cimkek);
        }
    }

    /**
     * 
     * 
     * 
     * Delete hir
     * 
     * 
     * 
     * @param type $id
     */
    function delete($hir_id) {
        // kitörlök minden meglévő cimke kapcsolatot az adott posttal kapcsolatban.
        $this->db->where('term_table_name', $this->hir_table);
        $this->db->where('term_id', $hir_id);
        $this->db->where('taxonomy_table_name', $this->hir_cimke_table);
        $this->db->delete($this->relationship_table);
        // delete hir data from hir_table
        $this->db->where('hir_id', $hir_id);
        $this->db->delete($this->hir_table);
    }

    /**
     * 
     * Add new hir
     * 
     * labelek elmentése itt történik.
     * 
     * @param type $hir_data
     */
    function add_hir($hir_data = array()) {
        // ide mentjük a cimkéket
        $cimkek = NULL;
        // kimentjük a cimkéket, ha vannak egy string-be
        if (isset($hir_data['hir_cimkek'])) {
            $cimkek = $hir_data['hir_cimkek'];
            // kiszedjük az insert-ből, mivel nem ott kell
            unset($hir_data['hir_cimkek']);
        }

        // insert hir_data
        $this->db->insert($this->hir_table, $hir_data);

        // elmentjük a cimkeket, ha létrehoztuk a stringüket előbb.
        if (!is_null($cimkek) && $cimkek != '') {
            // ha az utolsó karaktere | akkor azt itt kiszedjük
            if ($cimkek[strlen($cimkek) - 1] == "|") {
                $cimkek = substr($cimkek, 0, -1);
            }
            // megszerezzük az id-t amivel be lett illesztve a hír
            $last_insert_id = $this->db->insert_id();
            // elválasztóként univerzálisan |-ot használunk ebben a rendszerben
            $cimkek = explode("|", $cimkek);
            foreach ($cimkek as $cimke) {
                $cimke = trim($cimke);
            }
            // elmentjük a címkéket (ha kell)
            $this->hir_cimke_model->save_hir_cimke($cimkek);
            // most pedig elmentjük a kapcsolatokat.
            $this->save_realationships($last_insert_id, $cimkek);
        }
    }

    /**
     * 
     * returns the hir (for pagination)
     * 
     * options:
     *  select 
     *  search
     *  order_by
     *  order_dir
     *  limit
     *  offset
     * 
     * @param type $limit the number of returned hir
     * @param type $offset from this number.
     * @return type 
     */
    function get_hirek($options = array()) {

        if (isset($options['select'])) {
            $this->db->select($options['select']);
        }

        if (isset($options['search_like'])) {
            $this->db->like('hir_tipus', $options['search_like']);
            $this->db->or_like('hir_cim', $options['search_like']);
            $this->db->or_like('hir_szoveg', $options['search_like']);
        }

        if (isset($options['limit']) && isset($options['offset']))
            $this->db->limit($options['limit'], $options['offset']);

        if (isset($options['order_by'])) {
            if (isset($options['order_dir'])) {
                $this->db->order_by($options['order_by'], $options['order_dir']);
            } else {
                $this->db->order_by($options['order_by']);
            }
        }

        $query = $this->db->get($this->hir_table);


        return $query->result();
    }

    /**
     * 
     * Returns the number of hir
     * 
     * 
     * @return type 
     */
    function count() {
        return $this->db->count_all_results($this->hir_table);
    }

    /**
     * Gives back hir by id 
     * 
     * @param type $id
     * @return array (hir_id, hirname, hir)
     */
    function get_hir($hir_id) {
        // elkérem a hirt
        $this->db->where("$this->hir_table.hir_id", $hir_id);
        $query = $this->db->get("$this->hir_table");
        // do the query
        $result = $query->result();
        $result = $result[0];
        // ide rakjuk a cimkéket, és a slugokat
        $result->hir_cimkek = "";
        $result->hir_cimke_slugok = "";
        // ha van result, akkor hozzáadom a labeleket
        if ($result) {
            // megszerezzük a kapcsolatokat
            $this->db->where('term_table_name', $this->hir_table);
            $this->db->where('term_id', $hir_id);
            $this->db->where('taxonomy_table_name', $this->hir_cimke_table);
            $query = $this->db->get($this->relationship_table);
            $relation_result = $query->result();
            if ($relation_result) {
                // egyenként megszerezzük a labelek nevét
                foreach ($relation_result as $relation) {
                    $this->db->where('cimke_id', $relation->taxonomy_id);
                    $query = $this->db->get($this->hir_cimke_table);
                    $cimke_result = $query->result();
                    // hozzáadjuk, | separator! a végére is kell!
                    $result->hir_cimkek .= $cimke_result[0]->cimke_nev . "|";
                    $result->hir_cimke_slugok .= $cimke_result[0]->cimke_nev_slug . "|";
                }
            }
        }

        if ($result == NULL)
            return NULL;
        return $result;
    }

    /**
     * Gives back hir by id 
     * 
     * @param type $id
     * @return array (hir_id, hirname, hir)
     */
    function get_hir_by_slug($slug, $ignore_id = NULL) {
        // constructing active record query
        // ignore id
        if ($ignore_id) {
            $this->db->where_not_in('hir_id', $ignore_id);
        }
        $query = $this->db->get_where($this->hir_table, array('hir_cim_slug' => $slug));
        // do the query
        $result = $query->result();
        if ($result == NULL)
            return NULL;
        return $result[0];
    }

    /**
     *
     * Elmenti a kapcsolatokat az adatbázisba
     * 
     * 
     * @param type $hir_id
     * @param type $cimkek 
     * 
     */
    function save_realationships($hir_id, $cimkek = array()) {
        // kitörlök minden meglévő cimke kapcsolatot az adott posttal kapcsolatban.
        $this->db->where('term_table_name', $this->hir_table);
        $this->db->where('term_id', $hir_id);
        $this->db->where('taxonomy_table_name', $this->hir_cimke_table);
        $this->db->delete($this->relationship_table);

        // most pedig minden kapcsolatot lementünk
        // ezzel frissítve és egyben hozzááadva foolproof
        foreach ($cimkek as $cimke) {
            $cimke_data = $this->hir_cimke_model->get_hir_cimke_by_slug(_generate_slug($cimke));
            // ha nem létezik a cimke meghalunk, végzetes hiba, már tuti meg kellett csinálni
            if ($cimke_data == NULL)
                show_error("HIBA: A CIMKE NEM LETEZIK AZ ADATBAZISBAN. @HIR_MODEL:save_realationships");
            $kapcsolat_data = array(
                'term_table_name' => $this->hir_table,
                'term_id' => $hir_id,
                'taxonomy_table_name' => $this->hir_cimke_table,
                'taxonomy_id' => $cimke_data->cimke_id
            );
            // beillesztjük
            $this->db->insert($this->relationship_table, $kapcsolat_data);
        }
    }

}